# 匿名函数
# lambda的语法结构：lambda 参数列表: 函数体
# 基本使用
add = lambda x, y: x + y
print(add(1, 2))    # 3

# 匿名函数的使用场景
# 与内置函数结合使用
# map(): 函数接收一个函数和一个序列，将函数应用到序列的每个元素上，并返回一个迭代器。
numbers = [1, 2, 3, 4, 5]
squares = map(lambda x: x ** 2, numbers)
print(list(squares))    # [1, 4, 9, 16, 25]
# filter(): 函数接收一个函数和一个序列，将函数应用到序列的每个元素上，并返回一个迭代器，只返回满足条件的元素。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))   # [2, 4, 6, 8, 10]

print("=" * 50)
# 递归函数
# 阶乘
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5)) # 120

# 斐波那契数列
def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

print(fib(10))  # 55

print("=" * 50)
# 闭包
# 基本示例
# 外部函数
def outer_func(text):
    # 内部函数
    def inner_func():
        print(text) # 内部函数引用了外部函数的变量
    return inner_func

closure = outer_func("hello")
closure()   # hello

# 工厂函数，动态生成带有特定参数的函数
def make_adder(x):
    def add(y):
        return x + y
    return add

adder = make_adder(5)
print(adder(3)) # 8

print("=" * 50)
# 回调函数示例
# 异步操作
import time
def start_task(callback):
    print("开始执行任务...")
    # 这里使用sleep来模拟业务操作耗时
    time.sleep(2)
    # 业务执行完成后调用回调函数
    callback("执行回调函数")

def task_callback(message):
    print(message)

start_task(task_callback)
print("任务结束")

# 事件驱动
def button_clicked():
    print("按钮被点击后要执行的动作...")

def click(callback):
    print("执行按钮点击操作")
    callback()

click(button_clicked)